// () 表示捕获分组 会把每个分组里面匹配的值保存起来
console.log('1ab'.match(/1[a-z]([b-c])/))
// [ '1ab', 'b', index: 0, input: '1ab', groups: undefined ] 分组是 'b'
// [整个正则匹配的字符串, 分组匹配到的值, index:从字符串哪个位置开始匹配, input:整个字符串的值, groups:命名捕获分组]

// (?:) 表示非捕获分组 匹配的值不会保存起来
// console.log('1ab'.match(/1[a-z](?:[a-z])/))
// [ '1ab', index: 0, input: '1ab', groups: undefined ]
// [整个正则匹配的字符串, 从字符串的哪个位置开始匹配, 整个字符串的值, 命名捕获分组]

// (?<name>) 表示命名捕获分组
// console.log('11-22'.replace(/(?<x>\d{2})-(?<y>\d{2})/, "$<y>-$<x>"))
// 22-11
// ?<分组名>
// $<引用的分组名>
// \d 表示数字
// {2} 代表长度为 2

// 默认分组的引用使用 $数字 其中数字从1开始
// console.log('11-22'.replace(/(\d{2})-(\d{2})/, "$2-$1"))
// $1 代表引用第一个默认分组
// $2 代表引用第二个默认分组


// (?=pattern) 正向肯定查找 正向前瞻 代表后面必须跟着什么东西
console.log('1a'.match(/\d(?=[a-z])[a-z]/))
// [ '1a', index: 0, input: '1a', groups: undefined ]
// (?=[a-z]) 代表后面必须是 [a-z] 并且本次不会消耗字符


// (?!pattern) 正向否定查找 正向否定前瞻 代表后面必须不跟着什么东西
console.log('1a'.match(/\d(?![A-Z])[a-z]/))
// [ '1a', index: 0, input: '1a', groups: undefined ]
// (?![A-Z]) 代表后面不能是 [A-Z] 并且本次不会消耗字符


// (?<=pattern) 反向肯定前瞻 要求前面必须跟着什么东西
console.log('1a'.match(/\d(?<=[1])[a-z]/))
// [ '1a', index: 0, input: '1a', groups: undefined ]
// (?<=[1])  要求前面必须是 [1]

// (?<!pattern) 反向否定前瞻 要求前面必须不能跟着什么东西
console.log('1a'.match(/\d(?<![a-z])[a-z]/))
// [ '1a', index: 0, input: '1a', groups: undefined ]
// (?<![a-z])  要求前面不能跟着 [a-z]

let array = ['1a'] // 定义数组
array.index = 0 // 数组的属性
array.input = '1a'
array.groups = undefined
console.log(array)
// [ '1a', index: 0, input: '1a', groups: undefined ]
